//go:build ignore
// +build ignore

package main

import (
	"fmt"
	"time"
)

// "sort"

func producer(in chan<- int, stop <-chan bool) {
	x, y := 1, 1
	for {
		// 不断监听管道情况
		select {
		case in <- x:
			// in管道能写入x
			x, y = y, x+y
			// 让输出不要太快
			time.Sleep(time.Second)
		case <-stop:
			// 能从stop管道拿出东西代表要停止了
			fmt.Println("is time to stop")
			// 关闭通道，消费者取完剩下的东西后就会停
			close(in)
			return
		}
	}
}

func consumer(out <-chan int) {
	for {
		// 不断尝试取数
		val, ok := <-out
		if !ok {
			// 管道关闭了
			break
		}
		fmt.Println(val)
	}
}

func main() {
	// 协程实现斐波那契数列
	ch := make(chan int)
	stop := make(chan bool)

	// 生产者
	go producer(ch, stop)

	// 消费者
	go consumer(ch)

	// 让上面两个协程工作5秒
	time.Sleep(time.Second * 5)

	// 送出停止信号
	stop <- true

	// 后面停个死循环让stop信号顺利被读取到，不然程序直接结束了，producer不会进入stop的select
	for {
		time.Sleep(time.Second)
		fmt.Println("over")
	}
}
